modem digital audio interface summary 您所在的位置:网站首页 digital audio 接口 modem digital audio interface summary

modem digital audio interface summary

#modem digital audio interface summary| 来源: 网络整理| 查看: 265

一、PCM(Pulse Code Modulation)

1.介绍 PCM脉冲编码调制就是把一个时间连续,取值连续的模拟信号进行采样,再对采样值幅度进行量化、编码为数字信号的过程。其工作原理大致如下:

“防失真滤波器”是一个低通滤波器,用来滤除声音频带以外的信号; “波形编码器”可暂时理解为“采样器”;“量化器”可理解为“量化阶大小(step-size)”生成器或者称为“量化间隔”生成器 

声音数字化有两个步骤:

第一步是采样,就是每隔一段时间间隔读一次声音的幅度;第二步是量化,就是把采样得到的声音信号幅度转换成数字值。但那时并没有涉及如何进行量化。量化有好几种方法,但可归纳成两类:一类称为均匀量化,另一类称为非均匀量化。采用的量化方法不同,量化后的数据量也就不同。因此,可以说量化也是一种压缩数据的方法。 

波形声音的码率 = 取样频率 × 量化位数 × 声道数

(1)均匀量化采用相等的量化间隔对采样得到的信号作量化,那么这种量化称为均匀量化。均匀量化就是采用相同的“等分尺”来度量采样得到的幅度,也称为线性量化 量化后的样本值Y和原始值X的差E=Y-X称为量化误差或量化噪声

(2) 非均匀量化非线性量化:对输入信号进行量化时,大的输入信号采用大的量化间隔,小的输入信号采用小的量化间隔。这样就可以在满足精度要求的情况下用较少的位数来表示。声音数据还原时,采用相同的规则。 在非线性量化中,采样输入信号幅度和量化输出数据之间定义了两种对应关系,一种称为u律压扩(companding)算法,另一种称为A律压扩算法。 采样频率为8 kHz,样本精度为13位、14位或者16位的输入信号,使用m 律压扩编码或者使用A律压扩编码,经过PCM编码器之后每个样本的精度为8位,输出的数据率为64 kb/s。这就是CCITT推荐的G.711标准。  u律压扩: 北美和日本等地区 13位PCM编码转换城8位。  A律压扩 欧洲和中国大陆等地区, 14位PCM编码转换城8位 输出信号均为64Kb/s 2. HUAWEI MU509 PCM Audio Design Interface Huawei LGA modem 模块支持PCM接口来传输和发送音频数据 (1) PCM接口定义

(2) PCM CLOCK MODE

华为modem只能工作在master模式,modem是clock的信号源。

(3)Modem PCM 音频接口工作特性 

Clock工作频率为 2.048MHZ,只能工作在master mode       采样频率为 8KHZ对于usp模拟pcm接口来讲,它工作在Master  Mode时,SCLK由usp产生,其最大时钟频率=1/6  I/O 时钟频率;它工作在Slave mode 时,SCLK由外部设备产生,最大时钟频率=1/20  I/O 时钟。实际频率值通过USP_CLK_DIVISOR寄存器计算所得。采用short-sync (Primary PCM) mode,在此模式下,modem只能做主设备,不支持从设备。支持linear模式与u_law模式两种,linear模式下语音编码为13bit,u_law模式为8bit.华为模块编码位不能更改,我们只能配合模块修改我们自己usp控制器的编码位;研发推荐使用u_law(8bit)--u_law(8bit)模式,实际测试发现linear(13bit)--linear(8bit)模式效果较好,所以我们自己设定华为modem用的是linear模式; MU509 linear模式下为13bit,客户端linear模式设置为8bit,尽管位数编码不一致,但不影响正常语音效果;客户端若为16bit则无法通讯; 模块与客户端模式、编码位等必须设置一致,之后必须对模块进行断电重启。 PCM语音调试只有ATCPCM这一条指令 linear模式:ATCPCM=0,0,0,0,0u_law模式:ATCPCM=0,1,0,0,0;

(4) 关于short frame sync 和 long-frame sync PCM Interface

根据clock控制PCM数据传输的格式不同,分为long-frame sync和short-frame Sync 格式。

在Long Frame Sync 格式中,PCM_SYNC的上升沿指示PCM 数据的开始位。

一般来说,在这种格式下,当PCM_CLK下降沿时,采样PCM_IN 当PCM_CLK上升沿时,传输PCM_OUT.

其格式如下图所示:

Short Frame Sync 在这种格式下,PCM_SYNC 下降沿指示数据字开始传输。

PCM_SYNC 的长度总是一个时钟周期。和Long Frame Sync 一样,PCM_CLK的下降沿采样PCM_IN,在它的上升沿传输PCM_OUT.

其格式如下图所示:

(5) PCM音频格式配置USP控制寄存器 大多数Modem通过PCM接口来传输音频数据,所以我们要用USP2模拟PCM接口, 重点是我们必须将USP2配置成合适的PCM格式,否则将影响音频数据的传输。

以下寄存器的配置是非常重要的,配错一位,就可导致传输数据有问题。

(6)ALSA-Lib的 PCM (digital audio) plugins

对于pcm设备,我们需要在alsa层给予定义,为alsa层调用提供pcm handler。

在alsa可用的调试工具有 amixer,aplay,arecord

或者添加宏定义,编译出新的工具如alsa_amixer,alsa_aplay等等。

用例:

$Amixer

Simple mixer control 'Headphone',0

Capabilities: pswitch pswitch-joined

Playback channels: Mono

Mono: Playback [off]

Simple mixer control 'Capture',1

Capabilities: cvolume cswitch

Capture channels: Front Left - Front Right

Limits: Capture 0 - 7

Front Left: Capture 7 [100%] [off]

Front Right: Capture 7 [100%] [off]

Simple mixer control 'Speaker',0

Capabilities: volume pswitch pswitch-joined

Playback channels: Front Left - Front Right

Capture channels: Front Left - Front Right

Limits: 0 - 127

Front Left: 127 [100%] Playback [on]

Front Right: 127 [100%] Playback [on]

可以通过这个命令来设置speaker或者micphone的增益以及开关。

如:

Amixer sset 'Speaker',0 on/off 打开/关闭speaker

Amixer sset 'Speaker',0 122 设置增益

Arecord !-Dhw:0,0 -r 48000 -c 1 -f S16 -t raw /d.pcm从mic录音到文件

Aplay !-Dhw:0,0 -r 48000 -c 2 -f S16 -t raw /d.pcm播放音频文件到speaker

Aplay –l查看设备的device number和card number

对于设备的配置文件定义和如何使用alsa插件,

关于将双通道合成单通道的例子:

pcm.!default makemono

pcm.makemono {

type route

slave.pcm "hw:0"

ttable {

0.0 1 # in-channel 0, out-channel 0, 100% volume

1.0 1 # in-channel 1, out-channel 0, 100% volume

}

}

可参考网址:

 http://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html

 https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture/Example_Configurations

(7)关于采样位数转化方法

(a)(signed 8bit –>signed16bit)

if (data[i]&0x0080)

data[i] += 0xFF00; convert to negative 16-bit

else

data[i] = data[i];

end

The most significant bit of a signed number is the minus bit. Without the adjustment to a 16 bit ('+= 0xFF00') negative an 8 bit negative would be still be a positive number in signed 16 bit.

Because we only want to convert a range limited subset, we need to adjust the negative value.

In a signed 8 bit number we go from -128 (0x80) through -1 (0xFF) then 0 to +127 (0x7F).

In a signed 16 bit we go from -32768 (0x8000) through -128 (0xFF80) to -1 (0xFFFF) then 0 through +127 (0x007F) to 32767 (0x7FFF).

As you can see, the positive side need no adjustment, but the negative needs to be within -128 from zero (0xFF80) for the conversion to work.

(b)int signed16 = (int)((signed char)data[i]);

(c )*dst++ = (int16_t)(*src1^0x80)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有